位操作是程序设计中对位模式按位或二进制数的一元和二元操作。 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多。 在现代架构中, 情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)

缺点:只能为整型和字符型数据

 

位运算主要是针对二进制进行的计算操作,其主要有:与  &非  ! | 异或  ^ 左移  >  右移  <

1.与  &
使用规律如下:两个操作数中位都为1,结果才为1,否则结果为0,例如:

1&1=1

1&0=0

0&1=0

0&0=0

---

001

101

---------------

001(结果)

结论1:两个数a和b(0<a<b)相与其结果范围是[0,a],包含0和a

应用场景:hashMap中让hashCode和map数组大小减一进行与操作,得到该key在数组中的位置角标值。

2.异或  ^

 

结论1:两个相同的数进行异或结果是0

应用场景:storm重arck机制,使用了该操作来判断任务是否完成。

 

其他:http://wenwen.m.sogou.com/mq/qudetail.jsp?qid=606323001&w=c%E8%AF%AD%E8%A8%80%E7%9A%84%E8%B4%9F%E5%80%BC%E7%9C%8B%E4%B8%8D%E6%87%82&g_ut=3

 

使用场景:基于位运算的权限设计

http://blog.csdn.net/ajian005/article/details/8490899

 

百度百科: http://baike.baidu.com/view/379209.htm

 

实例2:java中使用 byte数组要使用 & oxff 才能进行运算(sonar中的一个bug)相关介绍

http://blog.csdn.net/leonwang_fly/article/details/47422235

 

 

public static void main(String[] args) {
  byte b=-1;
  System.out.println((int)(char)b);
  System.out.println((int)(char)(b & 0xff));
}

 

正如你所看到的: 
第1个代码片段的运行结果是:-1 
第2个代码片段的运行结果是:65535和255

 

3、左移(右移)符号 

 public static void main(String[] args) {
        //左移 2 * 2 的1次方 = 4
        System.out.println(2<<1);
        //右移 2/2的1次方 = 1
        System.out.println(2>>1);
        //无符号右移 2/2的1次方 = 1
        System.out.println(2>>>1);
        //无符号右移 -2/2的1次方 = 2147483647
        System.out.println(-2>>>1);
    }

用法javaPriorityQueue队列中的排序算法 (此处等同于除以2,但是比除2更加高效)

 private void siftUpUsingComparator(int k, E x) {
        while (k > 0) {
//此处等同于除以2,但是比除2更加高效
int parent = (k - 1) >>> 1; Object e = queue[parent]; if (comparator.compare(x, (E) e) >= 0) break; queue[k] = e; k = parent; } queue[k] = x; }

 

posted on 2016-09-21 23:32  张释文  阅读(706)  评论(0编辑  收藏  举报